home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / plugin.py < prev    next >
Text File  |  2008-10-13  |  13KB  |  415 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22.  
  23.  
  24. __version__ = '1.0'
  25. __title__ = 'Plugin Download and Install Utility'
  26. __doc__ = ""
  27.  
  28. # Std Lib
  29. import sys
  30. import getopt
  31. import time
  32. import os.path
  33. import re
  34. import os
  35. import gzip
  36.  
  37.  
  38. # Local
  39. from base.g import *
  40. from base import device, utils, tui
  41. from prnt import cups
  42.  
  43. pm = None
  44.  
  45.  
  46. def plugin_download_callback(c, s, t):
  47.     pm.update(int(100*c*s/t), 
  48.              utils.format_bytes(c*s))
  49.  
  50.              
  51. def plugin_install_callback(s):
  52.     print s
  53.     
  54.     
  55.  
  56. USAGE = [ (__doc__, "", "name", True),
  57.           ("Usage: hp-plugin [OPTIONS]", "", "summary", True),
  58.           ("Enter graphical UI mode:", "-u or --gui (Default)", "option", False),
  59.           ("Run in interactive mode:", "-i or --interactive", "option", False),
  60.           utils.USAGE_LANGUAGE,
  61.           utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  62.           utils.USAGE_HELP,
  63.           utils.USAGE_SPACE,
  64.           utils.USAGE_SEEALSO,
  65.           ("hp-setup", "", "seealso", False),
  66.         ]
  67.  
  68.  
  69. def usage(typ='text'):
  70.     if typ == 'text':
  71.         utils.log_title(__title__, __version__)
  72.  
  73.     utils.format_text(USAGE, typ, __title__, 'hp-plugin', __version__)
  74.     sys.exit(0)
  75.  
  76.  
  77.  
  78.  
  79. log.set_module('hp-plugin')
  80.  
  81. try:
  82.     opts, args = getopt.getopt(sys.argv[1:], 'hl:guiq:p:',
  83.         ['help', 'help-rest', 'help-man',
  84.          'logging=', 'gui', 'interactive',
  85.          'help-desc', 'lang=', 'plugin=', 'path='])
  86.          
  87. except getopt.GetoptError, e:
  88.     log.error(e.msg)
  89.     usage()
  90.  
  91. log_level = logger.DEFAULT_LOG_LEVEL
  92. mode = GUI_MODE
  93. mode_specified = False
  94. loc = None
  95. plugin_path = None
  96.  
  97. if os.getenv("HPLIP_DEBUG"):
  98.     log.set_level('debug')
  99.  
  100. for o, a in opts:
  101.     if o in ('-h', '--help'):
  102.         usage('text')
  103.  
  104.     elif o == '--help-rest':
  105.         usage('rest')
  106.  
  107.     elif o == '--help-man':
  108.         usage('man')
  109.  
  110.     elif o == '--help-desc':
  111.         print __doc__,
  112.         sys.exit(0)
  113.  
  114.     elif o in ('-l', '--logging'):
  115.         log_level = a.lower().strip()
  116.         if not log.set_level(log_level):
  117.             usage()
  118.  
  119.     elif o == '-g':
  120.         log.set_level('debug')
  121.  
  122.     elif o in ('-u', '--gui'):
  123.         if mode_specified:
  124.             log.error("You may only specify a single mode as a parameter (-i or -u).")
  125.             sys.exit(1)
  126.  
  127.         mode = GUI_MODE
  128.         mode_specified = True
  129.  
  130.     elif o in ('-i', '--interactive'):
  131.         if mode_specified:
  132.             log.error("You may only specify a single mode as a parameter (-i or -u).")
  133.             sys.exit(1)
  134.  
  135.         mode = INTERACTIVE_MODE
  136.         mode_specified = True
  137.  
  138.     elif o in ('-q', '--lang'):
  139.         if a.strip() == '?':
  140.             tui.show_languages()
  141.             sys.exit(0)
  142.  
  143.         loc = utils.validate_language(a.lower())
  144.         
  145.     elif o in ('-p', '--path', '--plugin'):
  146.         plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(a)))
  147.  
  148.  
  149. utils.log_title(__title__, __version__)
  150.  
  151. #version = sys_cfg.hplip.version
  152. version = '.'.join(sys_cfg.hplip.version.split('.')[:3])
  153.  
  154. if plugin_path is not None:
  155.     if not os.path.exists(plugin_path):
  156.         log.error("Plug-in path '%s' not found." % plugin_path)
  157.         sys.exit(1)
  158.         
  159.     if os.path.isdir(plugin_path):
  160.         plugin_path = os.path.join(plugin_path, 'hplip-%s-plugin.run' % version)
  161.         
  162.         if not os.path.exists(plugin_path):
  163.             log.error("Plug-in path '%s' not found." % plugin_path)
  164.             sys.exit(1)
  165.  
  166.         
  167. if mode == GUI_MODE:
  168.     if not prop.gui_build:
  169.         log.warn("GUI mode disabled in build. Reverting to interactive mode.")
  170.         mode = INTERACTIVE_MODE
  171.  
  172.     elif not os.getenv('DISPLAY'):
  173.         log.warn("No display found. Reverting to interactive mode.")
  174.         mode = INTERACTIVE_MODE
  175.  
  176.     elif not utils.checkPyQtImport():
  177.         log.warn("PyQt init failed. Reverting to interactive mode.")
  178.         mode = INTERACTIVE_MODE
  179.  
  180.         
  181. if mode == GUI_MODE:
  182.     from qt import *
  183.     from ui import pluginform2
  184.  
  185.     app = QApplication(sys.argv)
  186.     QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
  187.  
  188.     if loc is None:
  189.         loc = user_cfg.ui.get("loc", "system")
  190.         if loc.lower() == 'system':
  191.             loc = str(QTextCodec.locale())
  192.             log.debug("Using system locale: %s" % loc)
  193.  
  194.     if loc.lower() != 'c':
  195.         e = 'utf8'
  196.         try:
  197.             l, x = loc.split('.')
  198.             loc = '.'.join([l, e])
  199.         except ValueError:
  200.             l = loc
  201.             loc = '.'.join([loc, e])
  202.  
  203.         log.debug("Trying to load .qm file for %s locale." % loc)
  204.         trans = QTranslator(None)
  205.  
  206.         qm_file = 'hplip_%s.qm' % l
  207.         log.debug("Name of .qm file: %s" % qm_file)
  208.         loaded = trans.load(qm_file, prop.localization_dir)
  209.  
  210.         if loaded:
  211.             app.installTranslator(trans)
  212.         else:
  213.             loc = 'c'
  214.  
  215.     if loc == 'c':
  216.         log.debug("Using default 'C' locale")
  217.     else:
  218.         log.debug("Using locale: %s" % loc)
  219.         QLocale.setDefault(QLocale(loc))
  220.         prop.locale = loc
  221.         try:
  222.             locale.setlocale(locale.LC_ALL, locale.normalize(loc))
  223.         except locale.Error:
  224.             pass
  225.  
  226.     if not os.geteuid() == 0:
  227.         log.error("You must be root to run this utility.")
  228.  
  229.         QMessageBox.critical(None, 
  230.                              "HP Device Manager - Plug-in Installer",
  231.                              "You must be root to run hp-plugin.",
  232.                               QMessageBox.Ok,
  233.                               QMessageBox.NoButton,
  234.                               QMessageBox.NoButton)
  235.  
  236.         sys.exit(1)
  237.  
  238.     #try:
  239.     w = pluginform2.PluginForm2()
  240.     #except Error:
  241.     #    log.error("Unable to connect to HPLIP I/O. Please (re)start HPLIP and try again.")
  242.     #    sys.exit(1)
  243.  
  244.     app.setMainWidget(w)
  245.     w.show()
  246.  
  247.     app.exec_loop()
  248.  
  249.     
  250.     
  251. else: # INTERACTIVE_MODE
  252.     try:
  253.         if not os.geteuid() == 0:
  254.             log.error("You must be root to run this utility.")
  255.             sys.exit(1)
  256.  
  257.         log.info("(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)")
  258.         log.info("")
  259.  
  260.         from installer import core_install
  261.         core = core_install.CoreInstall()
  262.         
  263.         core.set_plugin_version() #version)
  264.         
  265.         plugin_filename = 'hplip-%s-plugin.run' % version
  266.         
  267.         tui.header("PLUG-IN INSTALLATION FOR HPLIP %s" % version)
  268.         
  269.         if core.check_for_plugin():
  270.             log.info("The driver plugin for HPLIP %s appears to already be installed.")
  271.             
  272.             cont, ans = tui.enter_yes_no("Do you wish to download and re-install the plug-in?")
  273.             
  274.             if not cont or not ans:
  275.                 sys.exit(0)
  276.                 
  277.         
  278.         if plugin_path is None:
  279.             table = tui.Formatter(header=('Option', 'Description'), min_widths=(10, 50))
  280.             table.add(('d', 'Download plug-in from HP (recomended)'))
  281.             table.add(('p', 'Specify a path to the plug-in (advanced)'))
  282.             table.add(('q', 'Quit hp-plugin (skip installation)'))
  283.             
  284.             table.output()
  285.             
  286.             cont, ans = tui.enter_choice("\nEnter option (d=download*, p=specify path, q=quit) ? ", 
  287.                 ['d', 'p'], 'd')
  288.             
  289.             if not cont: # q
  290.                 sys.exit(0)
  291.                 
  292.                         
  293.             if ans == 'd': # d - download
  294.                 # read plugin.conf (local or on sf.net) to get plugin_path (http://)
  295.                 plugin_conf_url = core.get_plugin_conf_url()
  296.                 
  297.                 if plugin_conf_url.startswith('file://'):
  298.                     tui.header("COPY CONFIGURATION")
  299.                 else:
  300.                     tui.header("DOWNLOAD CONFIGURATION")
  301.                     
  302.                     log.info("Checking for network connection...")
  303.                     ok = core.check_network_connection()
  304.                     
  305.                     if not ok:
  306.                         log.error("Network connection not detected.")
  307.                         sys.exit(1)
  308.                     
  309.                 
  310.                 log.info("Downloading configuration file from: %s" % plugin_conf_url)
  311.                 pm = tui.ProgressMeter("Downloading configuration:")
  312.                 
  313.                 plugin_path, size, checksum, timestamp, ok = core.get_plugin_info(plugin_conf_url, 
  314.                     plugin_download_callback)
  315.                 
  316.                 print
  317.                 
  318.                 if not plugin_path.startswith('http://') and not plugin_path.startswith('file://'):
  319.                     plugin_path = 'file://' + plugin_path
  320.             
  321.             else: # p - specify plugin path
  322.             
  323.                 while True:
  324.                     plugin_path = raw_input(log.bold("Enter the path to the 'hplip-%s-plugin.run' file (q=quit) : " %
  325.                         version)).strip()
  326.                         
  327.                     if plugin_path.strip().lower() == 'q':
  328.                         sys.exit(1)
  329.                         
  330.                     if not plugin_path.startswith('http://'):
  331.                         plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(plugin_path)))
  332.                         
  333.                         if not os.path.exists(plugin_path):
  334.                             log.error("Plug-in path '%s' not found." % plugin_path)
  335.                             continue
  336.                             
  337.                         if os.path.isdir(plugin_path):
  338.                             plugin_path = os.path.join(plugin_path, plugin_filename)
  339.                             
  340.                             if not os.path.exists(plugin_path):
  341.                                 log.error("Plug-in path '%s' not found." % plugin_path)
  342.                                 continue
  343.  
  344.                         if os.path.basename(plugin_path) != plugin_filename:
  345.                             log.error("Plug-in filename must be '%s'." % plugin_filename)
  346.                             continue
  347.                         
  348.                         plugin_path = 'file://' + plugin_path
  349.                     
  350.                     size, checksum, timestamp = 0, '', 0.0
  351.                     
  352.                     break
  353.         
  354.         
  355.         if plugin_path.startswith('file://'):
  356.             tui.header("COPY PLUGIN")
  357.         else:
  358.             tui.header("DOWNLOAD PLUGIN")
  359.             
  360.             log.info("Checking for network connection...")
  361.             ok = core.check_network_connection()
  362.             
  363.             if not ok:
  364.                 log.error("Network connection not detected.")
  365.                 sys.exit(1)
  366.     
  367.         log.info("Downloading plug-in from: %s" % plugin_path)
  368.         pm = tui.ProgressMeter("Downloading plug-in:")
  369.         
  370.         ok, local_plugin = core.download_plugin(plugin_path, size, checksum, timestamp, plugin_download_callback)
  371.         print
  372.         
  373.         if not ok:
  374.             log.error("Plug-in download failed: %s" % local_plugin)
  375.             sys.exit(1)
  376.         
  377.         tui.header("INSTALLING PLUG-IN")
  378.         
  379.         core.run_plugin(mode, plugin_install_callback)
  380.  
  381.         cups_devices = device.getSupportedCUPSDevices(['hp']) #, 'hpfax'])
  382.         #print cups_devices
  383.         
  384.         title = False
  385.         
  386.         for dev in cups_devices:
  387.             mq = device.queryModelByURI(dev)
  388.             
  389.             if mq.get('fw-download', 0):
  390.                 
  391.                 if not title:
  392.                     tui.header("DOWNLOADING FIRMWARE")
  393.                     title = True
  394.                 
  395.                 # Download firmware if needed
  396.                 log.info(log.bold("\nDownloading firmware to device %s..." % dev))
  397.                 try:
  398.                     d = device.Device(dev)
  399.                 except Error:
  400.                     log.error("Error opening device. Exiting.")
  401.                     sys.exit(1)
  402.  
  403.                 if d.downloadFirmware():
  404.                     log.info("Firmware download successful.\n")
  405.  
  406.                 d.close()
  407.  
  408.  
  409.     except KeyboardInterrupt:
  410.         log.error("User exit")
  411.  
  412. log.info("")
  413. log.info("Done.")
  414.  
  415.